
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>[k8s] 第三章 k8s 资源管理</title>
            </head>
            <body>
            <a href="https://andyoung.blog.csdn.net">原作者博客</a>
            <div id="content_views" class="markdown_views prism-atom-one-light">
                    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                    </svg>
                    <p>本章节主要介绍yaml语法和kubernetes的资源管理方式</p> 
<h3><a id="_3"></a>资源管理介绍</h3> 
<p>在kubernetes中，所有的内容都抽象为资源，用户需要通过操作资源来管理kubernetes。</p> 
<blockquote> 
 <p>​ kubernetes的本质上就是一个集群系统，用户可以在集群中部署各种服务，所谓的部署服务，其实就是在kubernetes集群中运行一个个的容器，并将指定的程序跑在容器中。</p> 
 <p>​ kubernetes的最小管理单元是pod而不是容器，所以只能将容器放在<code>Pod</code>中，而kubernetes一般也不会直接管理Pod，而是通过<code>Pod控制器</code>来管理Pod的。</p> 
 <p>​ Pod可以提供服务之后，就要考虑如何访问Pod中服务，kubernetes提供了<code>Service</code>资源实现这个功能。</p> 
 <p>​ 当然，如果Pod中程序的数据需要持久化，kubernetes还提供了各种<code>存储</code>系统。</p> 
</blockquote> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/96043c8845f4257e3269393337f7a691.png" alt=""></p> 
<blockquote> 
 <p>学习kubernetes的核心，就是学习如何对集群上的<code>Pod、Pod控制器、Service、存储</code>等各种资源进行操作</p> 
</blockquote> 
<h3><a id="YAML_19"></a>YAML语言介绍</h3> 
<p>​ YAML是一个类似 XML、JSON 的标记性语言。它强调以<strong>数据</strong>为中心，并不是以标识语言为重点。因而YAML本身的定义比较简单，号称"一种人性化的数据格式语言"。</p> 
<pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>heima</span><span class="token punctuation">&gt;</span></span>
	<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>age</span><span class="token punctuation">&gt;</span></span>15<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>age</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>address</span><span class="token punctuation">&gt;</span></span>Beijing<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>address</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>heima</span><span class="token punctuation">&gt;</span></span>
</code></pre> 
<pre><code class="prism language-yaml"><span class="token key atrule">heima</span><span class="token punctuation">:</span>
  <span class="token key atrule">age</span><span class="token punctuation">:</span> <span class="token number">15</span>
  <span class="token key atrule">address</span><span class="token punctuation">:</span> Beijing
</code></pre> 
<p>YAML的语法比较简单，主要有下面几个：</p> 
<ul><li>大小写敏感</li><li>使用缩进表示层级关系</li><li>缩进不允许使用tab，只允许空格( 低版本限制 )</li><li>缩进的空格数不重要，只要相同层级的元素左对齐即可</li><li>'#'表示注释</li></ul> 
<p>YAML支持以下几种数据类型：</p> 
<ul><li>纯量：单个的、不可再分的值</li><li>对象：键值对的集合，又称为映射（mapping）/ 哈希（hash） / 字典（dictionary）</li><li>数组：一组按次序排列的值，又称为序列（sequence） / 列表（list）</li></ul> 
<pre><code class="prism language-yaml"><span class="token comment"># 纯量, 就是指的一个简单的值，字符串、布尔值、整数、浮点数、Null、时间、日期</span>
<span class="token comment"># 1 布尔类型</span>
<span class="token key atrule">c1</span><span class="token punctuation">:</span> true (或者True)
<span class="token comment"># 2 整型</span>
<span class="token key atrule">c2</span><span class="token punctuation">:</span> <span class="token number">234</span>
<span class="token comment"># 3 浮点型</span>
<span class="token key atrule">c3</span><span class="token punctuation">:</span> <span class="token number">3.14</span>
<span class="token comment"># 4 null类型 </span>
<span class="token key atrule">c4</span><span class="token punctuation">:</span> <span class="token null important">~</span>  <span class="token comment"># 使用~表示null</span>
<span class="token comment"># 5 日期类型</span>
<span class="token key atrule">c5</span><span class="token punctuation">:</span> <span class="token datetime number">2018-02-17</span>    <span class="token comment"># 日期必须使用ISO 8601格式，即yyyy-MM-dd</span>
<span class="token comment"># 6 时间类型</span>
<span class="token key atrule">c6</span><span class="token punctuation">:</span> <span class="token datetime number">2018-02-17T15:02:31+08:00</span>  <span class="token comment"># 时间使用ISO 8601格式，时间和日期之间使用T连接，最后使用+代表时区</span>
<span class="token comment"># 7 字符串类型</span>
<span class="token key atrule">c7</span><span class="token punctuation">:</span> heima     <span class="token comment"># 简单写法，直接写值 , 如果字符串中间有特殊字符，必须使用双引号或者单引号包裹 </span>
<span class="token key atrule">c8</span><span class="token punctuation">:</span> line1
    line2     <span class="token comment"># 字符串过多的情况可以拆成多行，每一行会被转化成一个空格</span>
</code></pre> 
<pre><code class="prism language-yaml"><span class="token comment"># 对象</span>
<span class="token comment"># 形式一(推荐):</span>
<span class="token key atrule">heima</span><span class="token punctuation">:</span>
  <span class="token key atrule">age</span><span class="token punctuation">:</span> <span class="token number">15</span>
  <span class="token key atrule">address</span><span class="token punctuation">:</span> Beijing
<span class="token comment"># 形式二(了解):</span>
<span class="token key atrule">heima</span><span class="token punctuation">:</span> <span class="token punctuation">{<!-- --></span><span class="token key atrule">age</span><span class="token punctuation">:</span> <span class="token number">15</span><span class="token punctuation">,</span><span class="token key atrule">address</span><span class="token punctuation">:</span> Beijing<span class="token punctuation">}</span>
</code></pre> 
<pre><code class="prism language-yaml"><span class="token comment"># 数组</span>
<span class="token comment"># 形式一(推荐):</span>
<span class="token key atrule">address</span><span class="token punctuation">:</span>
  <span class="token punctuation">-</span> 顺义
  <span class="token punctuation">-</span> 昌平	
<span class="token comment"># 形式二(了解):</span>
<span class="token key atrule">address</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>顺义<span class="token punctuation">,</span>昌平<span class="token punctuation">]</span>
</code></pre> 
<blockquote> 
 <p>小提示：</p> 
 <p>​ 1 书写yaml切记<code>:</code> 后面要加一个空格</p> 
 <p>​ 2 如果需要将多段yaml配置放在一个文件中，中间要使用<code>---</code>分隔</p> 
 <p>​ 3 下面是一个yaml转json的网站，可以通过它验证yaml是否书写正确</p> 
 <p>​ https://www.json2yaml.com/convert-yaml-to-json</p> 
</blockquote> 
<h3><a id="_100"></a>资源管理方式</h3> 
<ul><li> <p>命令式对象管理：直接使用命令去操作kubernetes资源</p> <p><code>kubectl run nginx-pod --image=nginx:1.17.1 --port=80</code></p> </li><li> <p>命令式对象配置：通过命令配置和配置文件去操作kubernetes资源</p> <p><code>kubectl create/patch -f nginx-pod.yaml</code></p> </li><li> <p>声明式对象配置：通过apply命令和配置文件去操作kubernetes资源</p> <p><code>kubectl apply -f nginx-pod.yaml</code></p> </li></ul> 
<table><thead><tr><th>类型</th><th>操作对象</th><th>适用环境</th><th>优点</th><th>缺点</th></tr></thead><tbody><tr><td>命令式对象管理</td><td>对象</td><td>测试</td><td>简单</td><td>只能操作活动对象，无法审计、跟踪</td></tr><tr><td>命令式对象配置</td><td>文件</td><td>开发</td><td>可以审计、跟踪</td><td>项目大时，配置文件多，操作麻烦</td></tr><tr><td>声明式对象配置</td><td>目录</td><td>开发</td><td>支持目录操作</td><td>意外情况下难以调试</td></tr></tbody></table> 
<h4><a id="_120"></a>命令式对象管理</h4> 
<p><strong>kubectl命令</strong></p> 
<p>​ kubectl是kubernetes集群的命令行工具，通过它能够对集群本身进行管理，并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下：</p> 
<pre><code class="prism language-md">kubectl [command] [type] [name] [flags]
</code></pre> 
<p><strong>comand</strong>：指定要对资源执行的操作，例如create、get、delete</p> 
<p><strong>type</strong>：指定资源类型，比如deployment、pod、service</p> 
<p><strong>name</strong>：指定资源的名称，名称大小写敏感</p> 
<p><strong>flags</strong>：指定额外的可选参数</p> 
<pre><code class="prism language-powershell"><span class="token comment"># 查看所有pod</span>
kubectl get pod 

<span class="token comment"># 查看某个pod</span>
kubectl get pod pod_name

<span class="token comment"># 查看某个pod,以yaml格式展示结果</span>
kubectl get pod pod_name <span class="token operator">-</span>o yaml
</code></pre> 
<p><strong>资源类型</strong></p> 
<p>kubernetes中所有的内容都抽象为资源，可以通过下面的命令进行查看:</p> 
<pre><code class="prism language-powershell">kubectl api-resources
</code></pre> 
<p>经常使用的资源有下面这些：</p> 
<table><tbody><tr><th>资源分类</th><th>资源名称</th><th>缩写</th><th>资源作用</th></tr><tr><td rowspan="2">集群级别资源</td><td>nodes</td><td>no</td><td>集群组成部分</td></tr><tr><td>namespaces</td><td>ns</td><td>隔离Pod</td></tr><tr><td>pod资源</td><td>pods</td><td>po</td><td>装载容器</td></tr><tr><td rowspan="8">pod资源控制器</td><td>replicationcontrollers</td><td>rc</td><td>控制pod资源</td></tr><tr><td>replicasets</td><td>rs</td><td>控制pod资源</td></tr><tr><td>deployments</td><td>deploy</td><td>控制pod资源</td></tr><tr><td>daemonsets</td><td>ds</td><td>控制pod资源</td></tr><tr><td>jobs</td><td></td><td>控制pod资源</td></tr><tr><td>cronjobs</td><td>cj</td><td>控制pod资源</td></tr><tr><td>horizontalpodautoscalers</td><td>hpa</td><td>控制pod资源</td></tr><tr><td>statefulsets</td><td>sts</td><td>控制pod资源</td></tr><tr><td rowspan="2">服务发现资源</td><td>services</td><td>svc</td><td>统一pod对外接口</td></tr><tr><td>ingress</td><td>ing</td><td>统一pod对外接口</td></tr><tr><td rowspan="3">存储资源</td><td>volumeattachments</td><td></td><td>存储</td></tr><tr><td>persistentvolumes</td><td>pv</td><td>存储</td></tr><tr><td>persistentvolumeclaims</td><td>pvc</td><td>存储</td></tr><tr><td rowspan="2">配置资源</td><td>configmaps</td><td>cm</td><td>配置</td></tr><tr><td>secrets</td><td></td><td>配置</td></tr></tbody></table> 
<p><strong>操作</strong></p> 
<p>kubernetes允许对资源进行多种操作，可以通过–help查看详细的操作命令</p> 
<pre><code class="prism language-powershell">kubectl <span class="token operator">--</span>help
</code></pre> 
<p>经常使用的操作有下面这些：</p> 
<table><tbody><tr><th>命令分类</th><th>命令</th><th>翻译</th><th>命令作用</th></tr><tr><td rowspan="6">基本命令</td><td>create</td><td>创建</td><td>创建一个资源</td></tr><tr><td>edit</td><td>编辑</td><td>编辑一个资源</td></tr><tr><td>get</td><td>获取</td><td>获取一个资源</td></tr><tr><td>patch</td><td>更新</td><td>更新一个资源</td></tr><tr><td>delete</td><td>删除</td><td>删除一个资源</td></tr><tr><td>explain</td><td>解释</td><td>展示资源文档</td></tr><tr><td rowspan="10">运行和调试</td><td>run</td><td>运行</td><td>在集群中运行一个指定的镜像</td></tr><tr><td>expose</td><td>暴露</td><td>暴露资源为Service</td></tr><tr><td>describe</td><td>描述</td><td>显示资源内部信息</td></tr><tr><td>logs</td><td>日志</td><td>输出容器在 pod 中的日志</td></tr><tr><td>attach</td><td>缠绕</td><td>进入运行中的容器</td></tr><tr><td>exec</td><td>执行</td><td>执行容器中的一个命令</td></tr><tr><td>cp</td><td>复制</td><td>在Pod内外复制文件</td></tr><tr><td>rollout</td><td>首次展示</td><td>管理资源的发布</td></tr><tr><td>scale</td><td>规模</td><td>扩(缩)容Pod的数量</td></tr><tr><td>autoscale</td><td>自动调整</td><td>自动调整Pod的数量</td></tr><tr><td rowspan="2">高级命令</td><td>apply</td><td>rc</td><td>通过文件对资源进行配置</td></tr><tr><td>label</td><td>标签</td><td>更新资源上的标签</td></tr><tr><td rowspan="2">其他命令</td><td>cluster-info</td><td>集群信息</td><td>显示集群信息</td></tr><tr><td>version</td><td>版本</td><td>显示当前Server和Client的版本</td></tr></tbody></table> 
<p>下面以一个namespace / pod的创建和删除简单演示下命令的使用：</p> 
<pre><code class="prism language-powershell"><span class="token comment"># 创建一个namespace</span>
<span class="token namespace">[root@master ~]</span><span class="token comment"># kubectl create namespace dev</span>
namespace/dev created

<span class="token comment"># 获取namespace</span>
<span class="token namespace">[root@master ~]</span><span class="token comment"># kubectl get ns</span>
NAME              STATUS   AGE
default           Active   21h
dev               Active   21s
kube-node-lease   Active   21h
kube-public       Active   21h
kube-system       Active   21h

<span class="token comment"># 在此namespace下创建并运行一个nginx的Pod</span>
<span class="token namespace">[root@master ~]</span><span class="token comment"># kubectl run pod --image=nginx -n dev</span>
kubectl run <span class="token operator">--</span>generator=deployment/apps<span class="token punctuation">.</span>v1 is DEPRECATED and will be removed in a future version<span class="token punctuation">.</span> Use kubectl run <span class="token operator">--</span>generator=run-pod/v1 or kubectl create instead<span class="token punctuation">.</span>
deployment<span class="token punctuation">.</span>apps/pod created

<span class="token comment"># 查看新创建的pod</span>
<span class="token namespace">[root@master ~]</span><span class="token comment"># kubectl get pod -n dev</span>
NAME                   READY   STATUS    RESTARTS   AGE
pod-864f9875b9-pcw7x   1/1     Running   0          21s

<span class="token comment"># 删除指定的pod</span>
<span class="token namespace">[root@master ~]</span><span class="token comment"># kubectl delete pod pod-864f9875b9-pcw7x</span>
pod <span class="token string">"pod-864f9875b9-pcw7x"</span> deleted

<span class="token comment"># 删除指定的namespace</span>
<span class="token namespace">[root@master ~]</span><span class="token comment"># kubectl delete ns dev</span>
namespace <span class="token string">"dev"</span> deleted
</code></pre> 
<h4><a id="_424"></a>命令式对象配置</h4> 
<p>命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。</p> 
<p>1） 创建一个nginxpod.yaml，内容如下：</p> 
<pre><code class="prism language-yaml"><span class="token key atrule">apiVersion</span><span class="token punctuation">:</span> v1
<span class="token key atrule">kind</span><span class="token punctuation">:</span> Namespace
<span class="token key atrule">metadata</span><span class="token punctuation">:</span>
  <span class="token key atrule">name</span><span class="token punctuation">:</span> dev

<span class="token punctuation">---</span>

<span class="token key atrule">apiVersion</span><span class="token punctuation">:</span> v1
<span class="token key atrule">kind</span><span class="token punctuation">:</span> Pod
<span class="token key atrule">metadata</span><span class="token punctuation">:</span>
  <span class="token key atrule">name</span><span class="token punctuation">:</span> nginxpod
  <span class="token key atrule">namespace</span><span class="token punctuation">:</span> dev
<span class="token key atrule">spec</span><span class="token punctuation">:</span>
  <span class="token key atrule">containers</span><span class="token punctuation">:</span>
  <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> nginx<span class="token punctuation">-</span>containers
    <span class="token key atrule">image</span><span class="token punctuation">:</span> nginx<span class="token punctuation">:</span>1.17.1
</code></pre> 
<p>2）执行create命令，创建资源：</p> 
<pre><code class="prism language-powershell"><span class="token namespace">[root@master ~]</span><span class="token comment"># kubectl create -f nginxpod.yaml</span>
namespace/dev created
pod/nginxpod created
</code></pre> 
<p>此时发现创建了两个资源对象，分别是namespace和pod</p> 
<p>3）执行get命令，查看资源：</p> 
<pre><code class="prism language-powershell"><span class="token namespace">[root@master ~]</span><span class="token comment">#  kubectl get -f nginxpod.yaml</span>
NAME            STATUS   AGE
namespace/dev   Active   18s

NAME            READY   STATUS    RESTARTS   AGE
pod/nginxpod    1/1     Running   0          17s
</code></pre> 
<p>这样就显示了两个资源对象的信息</p> 
<p>4）执行delete命令，删除资源：</p> 
<pre><code class="prism language-powershell"><span class="token namespace">[root@master ~]</span><span class="token comment"># kubectl delete -f nginxpod.yaml</span>
namespace <span class="token string">"dev"</span> deleted
pod <span class="token string">"nginxpod"</span> deleted
</code></pre> 
<p>此时发现两个资源对象被删除了</p> 
<pre><code class="prism language-md">总结:
	命令式对象配置的方式操作资源，可以简单的认为：命令  +  yaml配置文件（里面是命令需要的各种参数）
</code></pre> 
<h4><a id="_487"></a>声明式对象配置</h4> 
<p>声明式对象配置跟命令式对象配置很相似，但是它只有一个命令apply。</p> 
<pre><code class="prism language-powershell"><span class="token comment"># 首先执行一次kubectl apply -f yaml文件，发现创建了资源</span>
<span class="token namespace">[root@master ~]</span><span class="token comment">#  kubectl apply -f nginxpod.yaml</span>
namespace/dev created
pod/nginxpod created

<span class="token comment"># 再次执行一次kubectl apply -f yaml文件，发现说资源没有变动</span>
<span class="token namespace">[root@master ~]</span><span class="token comment">#  kubectl apply -f nginxpod.yaml</span>
namespace/dev unchanged
pod/nginxpod unchanged
</code></pre> 
<pre><code class="prism language-md">总结:
    其实声明式对象配置就是使用apply描述一个资源最终的状态（在yaml中定义状态）
	使用apply操作资源：
        如果资源不存在，就创建，相当于 kubectl create
		如果资源已存在，就更新，相当于 kubectl patch
</code></pre> 
<blockquote> 
 <p>扩展：kubectl可以在node节点上运行吗 ?</p> 
</blockquote> 
<p>​ kubectl的运行是需要进行配置的，它的配置文件是$HOME/.kube，如果想要在node节点运行此命令，需要将master上的.kube文件复制到node节点上，即在master节点上执行下面操作：</p> 
<pre><code class="prism language-powershell">scp  <span class="token operator">-</span>r  HOME/<span class="token punctuation">.</span>kube   node1: HOME/
</code></pre> 
<blockquote> 
 <p>使用推荐: 三种方式应该怎么用 ?</p> 
</blockquote> 
<p>创建/更新资源 使用声明式对象配置 kubectl apply -f XXX.yaml</p> 
<p>删除资源 使用命令式对象配置 kubectl delete -f XXX.yaml</p> 
<p>查询资源 使用命令式对象管理 kubectl get(describe) 资源名称</p>
                </div>
            </body>
            </html>
            